package com.example.springbootv1.util;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * excel表导出的工具类
 * @author 张轩
 */
public class ExcelUtil {
	public static Map<String, HSSFCellStyle> createStyles(HSSFWorkbook wb) {
		Map<String, HSSFCellStyle> styles = new HashMap<String, HSSFCellStyle>();
		// ----------------------标题样式---------------------------
		HSSFCellStyle cell_header_title = wb.createCellStyle();
		HSSFFont font2 = wb.createFont();
		font2.setFontName("宋体");
		font2.setFontHeightInPoints((short) 12);// 设置字体大小
		font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 粗体
		cell_header_title.setFont(font2);// 选择需要用到的字体格式
		cell_header_title.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 居中
		cell_header_title.setWrapText(true);// 自动换行
		cell_header_title.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框
		cell_header_title.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
		cell_header_title.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
		cell_header_title.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
		styles.put("cell_header_title", cell_header_title);

		// -----------------------字体样式---------------------------
		HSSFCellStyle cell_data_default = wb.createCellStyle();
		HSSFFont font = wb.createFont();
		font.setFontName("宋体");
		font.setFontHeightInPoints((short) 10);// 设置字体大小
		cell_data_default.setFont(font);// 选择需要用到的字体格式
		cell_data_default.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 居中
		cell_data_default.setWrapText(true);// 自动换行
		cell_data_default.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框
		cell_data_default.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
		cell_data_default.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
		cell_data_default.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
		styles.put("cell_data_default", cell_data_default);

		return styles;
	}


	public HSSFWorkbook outputExcelFile(List<Object[]> list, InputStream inputStream,
			String[] names) {

		try {
//			FileInputStream fs = new FileInputStream(path); // 模板
			HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(inputStream));// 创建Excel文档
			Map<String, HSSFCellStyle> mapstyle = this.createStyles(wb);// 标题样式和字体样式
			HSSFCell[] firstcell = new HSSFCell[names.length];
			HSSFSheet hs = wb.getSheetAt(0);// 获得一个sheet

			HSSFRow firstrow = hs.createRow((short) 0);// 第二行的标题
			for (int i = 0; i < names.length; i++) {
				firstcell[i] = firstrow.createCell((short) i);
				firstcell[i].setCellStyle(mapstyle.get("cell_header_title"));
				firstcell[i].setCellValue(new HSSFRichTextString(names[i]));
			}
			hs.createFreezePane(0, 1);// 冻结行
			for (int i = 0; i < list.size(); i++) {
				firstrow = hs.createRow((short) i + 1);// 下标为1的开始
				Object[] obj = list.get(i);
				for (int j = 0; j < names.length; j++) { // 循环excel里的列数
					firstcell[j] = firstrow.createCell((short) j);
					firstcell[j]
							.setCellStyle(mapstyle.get("cell_data_default"));// 字体样式
					firstcell[j].setCellType(HSSFCell.CELL_TYPE_STRING);
					if (obj[j] == null || obj[j].equals("")) {
						firstcell[j].setCellValue("没有数据");
					} else {
						firstcell[j].setCellValue(obj[j].toString());
					}
				}
			}
			return wb;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 读excel
	 * @param filePath 文件目录
	 * @return List<List<String>>
	 * @throws IOException
	 */
	public static List<List<String>> readExcel(String filePath) throws IOException {
		List<List<String>> data = new ArrayList<>();
		FileInputStream fis = null;

		try {
			fis = new FileInputStream(filePath);

			// 创建 Workbook 对象（POI 3.9 方式）
			Workbook workbook;
			if (filePath.toLowerCase().endsWith(".xlsx")) {
				workbook = new XSSFWorkbook(fis);
			} else {
				workbook = new HSSFWorkbook(fis);
			}

			// 获取第一个工作表
			Sheet sheet = workbook.getSheetAt(0);

			// 遍历所有行
			for (int i = 0; i <= sheet.getLastRowNum(); i++) {
				Row row = sheet.getRow(i);
				List<String> rowData = new ArrayList<>();

				if (row != null) {
					// 遍历行中的所有单元格
					for (int j = 0; j < row.getLastCellNum(); j++) {
						Cell cell = row.getCell(j);
						rowData.add(getCellValueAsString(cell));
					}
				}

				data.add(rowData);
			}

		} finally {
			// 关闭文件输入流
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					System.err.println("关闭文件流失败: " + e.getMessage());
				}
			}
		}

		return data;
	}

	private static String getCellValueAsString(Cell cell) {
		if (cell == null) {
			return "";
		}

		// POI 3.9 使用不同的单元格类型枚举
		switch (cell.getCellType()) {
			case Cell.CELL_TYPE_STRING:
				return cell.getStringCellValue();
			case Cell.CELL_TYPE_NUMERIC:
				if (DateUtil.isCellDateFormatted(cell)) {
					return cell.getDateCellValue().toString();
				} else {
					// 处理数字格式
					double value = cell.getNumericCellValue();
					if (value == (long) value) {
						return String.valueOf((long) value);
					} else {
						return String.valueOf(value);
					}
				}
			case Cell.CELL_TYPE_BOOLEAN:
				return String.valueOf(cell.getBooleanCellValue());
			case Cell.CELL_TYPE_FORMULA:
				try {
					// 尝试获取公式计算后的值
					return String.valueOf(cell.getNumericCellValue());
				} catch (Exception e) {
					return cell.getCellFormula();
				}
			case Cell.CELL_TYPE_BLANK:
				return "";
			default:
				return "";
		}
	}

	public static void main(String[] args) {
		try {
			// 读取 Excel 文件
			List<List<String>> excelData = readExcel("C:\\Users\\HP\\Downloads\\学生信息.xls");

			// 打印数据
			for (List<String> row : excelData) {
				for (String cell : row) {
					System.out.print(cell + "\t");
				}
				System.out.println();
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}



	}


